Guida Completa alla Programmazione di Rete con Protocollo UDP
๐ 1. Introduzione alle Socket
1.1 Cos'รจ una Socket?
Una socket รจ un'interfaccia di programmazione che permette la comunicazione tra processi su una rete.
Possiamo pensarla come una "presa" virtuale attraverso cui i dati fluiscono tra due programmi, anche se si trovano
su computer diversi.
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ CLIENT โ โโโโโ Messaggio โโโโโโ โ SERVER โ
โ (192.168.1.2) โ โ (192.168.1.1) โ
โ Porta 5001 โ โ Porta 5000 โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
1.2 Componenti di una Comunicazione
๐ก Elementi Necessari per la Comunicazione
Indirizzo IP: identifica univocamente la macchina sulla rete (es: 192.168.1.100, localhost)
Porta: identifica il processo/servizio specifico sulla macchina (numero da 0 a 65535)
Protocollo: regole di comunicazione che definiscono come i dati vengono trasmessi (TCP o UDP)
Famiglia di indirizzi: tipo di rete (IPv4, IPv6, etc.)
โ๏ธ 2. TCP vs UDP: Le Differenze Fondamentali
2.1 Confronto Tecnico
Caratteristica
TCP (Transmission Control Protocol)
UDP (User Datagram Protocol)
Tipo di Connessione
Orientato alla connessione (handshake)
Senza connessione (connectionless)
Affidabilitร
Garantita: ritrasmissione automatica
Non garantita: i pacchetti possono perdersi
Ordine dei Pacchetti
Preservato sempre
Non garantito
Velocitร
Piรน lento (overhead maggiore)
Piรน veloce (overhead minimo)
Controllo di Flusso
Presente (flow control)
Assente
Controllo di Congestione
Presente
Assente
Dimensione Header
20 bytes (minimo)
8 bytes (fisso)
Uso Tipico
Web (HTTP), Email, File Transfer
Streaming, Gaming, DNS, VoIP
2.2 Analogia del Mondo Reale
๐ฌ TCP = Raccomandata con Ricevuta
Stabilisci una "connessione" con il destinatario
Sai che il messaggio รจ arrivato
Ricevi conferma di consegna
Se si perde, viene rispedito
Arriva nell'ordine corretto
Costa di piรน in tempo e risorse
๐ฎ UDP = Cartolina Normale
Nessuna connessione preventiva
Invii e speri che arrivi
Nessuna conferma di ricezione
Puรฒ perdersi per strada
Puรฒ arrivare in disordine
Veloce ed economica
2.3 Quando Usare UDP?
โ Usa UDP quando:
La velocitร รจ prioritaria rispetto all'affidabilitร
Perdere qualche pacchetto non รจ critico (es: streaming video in diretta)
Invii dati frequenti e aggiornati dove i dati vecchi non servono (posizione GPS, sensori)
Fai broadcast o multicast a piรน destinatari simultaneamente
Vuoi overhead minimo e massima performance
Implementi il tuo meccanismo di affidabilitร personalizzato
โ ๏ธ Evita UDP quando:
Ogni dato รจ critico e non puรฒ essere perso (transazioni bancarie, operazioni su database)
L'ordine dei messaggi รจ essenziale per l'elaborazione
Devi garantire la consegna di tutti i pacchetti
Trasferisci file completi che devono arrivare integri
๐๏ธ 3. Architettura Client-Server
3.1 Modello di Comunicazione
๐ฅ๏ธ SERVER
1. Crea socket UDP
โ
2. Bind a IP:Porta
โ
3. Ascolta (loop infinito)
โ
4. Riceve messaggio (recvfrom)
โ
5. Elabora richiesta
โ
6. Invia risposta (sendto)
๐ป CLIENT
1. Crea socket UDP
โ
2. Prepara messaggio
โ
3. Invia al server (sendto)
โ
4. Riceve risposta (recvfrom)
โ
5. Elabora risposta
โ
6. Chiude socket
3.2 Ruoli e Responsabilitร
๐ฅ๏ธ SERVER
Si mette in ascolto su un indirizzo/porta specifici
Attende messaggi dai client
Risponde alle richieste ricevute
ร sempre attivo (daemon)
Non inizia la comunicazione
Puรฒ gestire multiple richieste da client diversi
๐ป CLIENT
Inizia la comunicazione
Invia richieste al server
Attende risposte dal server
Si connette quando necessario
Non fa bind (porta assegnata automaticamente)
Puรฒ essere temporaneo (si chiude dopo uso)
๐ง 4. Socket UDP in Python
4.1 Il Modulo socket
Python fornisce il modulo socket built-in per la programmazione di rete.
Non richiede installazioni esterne ed รจ disponibile su tutte le piattaforme.
socket.AF_INET: Famiglia di indirizzi IPv4 (Address Family Internet)
socket.SOCK_DGRAM: Tipo datagram = UDP (DGRAM = datagram)
socket.SOCK_STREAM: Tipo stream = TCP (NON usare per UDP!)
4.3 Metodi Principali per UDP
4.3.1 bind(address) - Solo SERVER
Associa la socket a un indirizzo IP e porta specifici. Il server DEVE fare bind per "ascoltare" su una porta.
# Configurazione indirizzo server
host = 'localhost'# o '127.0.0.1' o '0.0.0.0'
port = 5000# Scegli porta > 1024# Bind della socket
sock.bind((host, port)) # Nota: tupla (host, port)!print(f"Server in ascolto su {host}:{port}")
โ ๏ธ Note Importanti su bind()
Solo il server deve fare bind(), il client NO!
L'argomento รจ una tupla (host, port) con parentesi doppie
Usa porte > 1024 (le porte 0-1023 sono riservate)
'0.0.0.0' = ascolta su tutte le interfacce di rete
'localhost' o '127.0.0.1' = solo connessioni locali
4.3.2 sendto(data, address) - CLIENT e SERVER
Invia dati a un destinatario specifico. Funziona sia per client che server.
# Preparazione messaggio
messaggio = "Ciao Server!"# Conversione stringa in bytes
bytes_messaggio = messaggio.encode('utf-8')
# Invio al server
sock.sendto(bytes_messaggio, ('localhost', 5000))
print(f"Inviato: {messaggio}")
๐ก Parametri di sendto()
data: dati da inviare come bytes (usa .encode())
address: tupla (host, port) del destinatario
Ritorna: numero di bytes inviati
4.3.3 recvfrom(bufsize) - CLIENT e SERVER
Riceve dati e l'indirizzo del mittente. Ritorna una tupla con i dati e l'indirizzo.
# Ricezione dati (max 1024 bytes)
data, indirizzo_mittente = sock.recvfrom(1024)
# Decodifica bytes in stringa
messaggio = data.decode('utf-8')
# Estrazione IP e porta del mittente
ip_mittente, porta_mittente = indirizzo_mittente
print(f"Ricevuto da {ip_mittente}:{porta_mittente}")
print(f"Messaggio: {messaggio}")
๐ก Parametri e Ritorno di recvfrom()
bufsize: numero massimo di bytes da ricevere (tipicamente 1024 o 4096)
Ritorna tupla: (data, address)
data: bytes ricevuti
address: tupla (ip, porta) del mittente
Blocca l'esecuzione finchรฉ non arrivano dati
4.3.4 close() - Sempre!
Chiude la socket e libera le risorse. SEMPRE da chiamare quando non serve piรน.
RFC 768 - UDP Protocol: Specifica ufficiale del protocollo UDP
Wireshark: Tool per analizzare traffico di rete UDP
netcat (nc): Utility command-line per testare socket
๐ ๏ธ Comandi Utili
# Linux/Mac: Vedere porte in uso
netstat -tulpn | grep :5000
# Testare server con netcat
echo "test" | nc -u localhost 5000
# Windows: Vedere porte
netstat -ano | findstr :5000
โ 14. Checklist Finale
๐ Prima dell'Esercitazione
โ So cos'รจ una socket
โ Conosco la differenza tra TCP e UDP
โ Capisco quando usare UDP
โ So che SOCK_DGRAM = UDP
โ So che SOCK_STREAM = TCP
โ So cosa fanno bind(), sendto(), recvfrom()
โ Ricordo che devo usare encode()/decode()
โ Capisco la differenza tra client e server
โ So che il server fa bind(), il client no
โ So impostare un timeout
โ So gestire le eccezioni base
โ Ho provato gli esempi pratici
โ Ho completato almeno 1 esercizio preparatorio
๐ฏ 15. Confronto Visivo: Flusso Completo
COMUNICAZIONE UDP COMPLETAFASE 1: INIZIALIZZAZIONE
Server Client
โ โ
โโ socket() โโ socket()
โโ bind(port) โ (no bind!)
โโ while True: โโโโ โโ pronto
โ
FASE 2: COMUNICAZIONE
Server โ Client
โ โ โ
โโ recvfrom() โโโโโผโโโโโโโโโโโโโโโโค sendto()
โ (attende...) โ โ (invia msg)
โ โ โ
โโ elabora() โ โ
โ โ โ
โโ sendto() โโโโโโโผโโโโโโโโโโโโโโโบโโ recvfrom()
โ โ โ (riceve)
โ โ โ
โโโโโโloopโโโโโโโโโ โโ close()
CARATTERISTICHE:
โ No handshake (diverso da TCP)
โ Ogni messaggio รจ indipendente
โ Server puรฒ rispondere a piรน client
โ Nessuna garanzia di consegna
โ Nessun controllo ordine pacchetti
๐ก Consiglio Finale: La chiave per padroneggiare le socket UDP รจ la pratica.
Prova a creare piccoli progetti personali, sperimenta con diversi scenari, e non aver paura
di fare errori - sono la migliore opportunitร di apprendimento!